import {someVariable} from "../../img/文件图标的base64";
import * as path from "path";
import MyPlugin from "../../../main";
import { TFile, WorkspaceLeaf} from "obsidian";
import {
	recentOpenFileMdPath,
	bianliang,
	recentOpenFilePath,
	recentSearchTagPath,
	searchPageIndex,
	sql,
	yml
} from "../全局变量";
import {
	redisLocak,
	保存临时数据到文件,
	判断文件是否激活并打开,
	在当前页面打开文件
} from "../../工具类和方法/文件相关工具类";

export function 新标签页打开常用文件(this_:MyPlugin){

	// 监听文件打开事件
	this_.registerEvent(this_.app.workspace.on('file-open', (file) => {
		if (file) {
			console.log("监听文件打开事件")
			根据文件名添加常用文件新便签页(file.path,this_);
			保存临时数据到文件(this_,file.path,this_.fileOpenCounts,recentOpenFilePath)
		}
	}));
	// 这个是当前工作区该表就会生效, 这个就是只要改变就有效，但是会判断当前是否打开了文件，如果没有打开文件就展示最近的文件
	this_.registerEvent(this_.app.workspace.on('layout-change', () => {
		const activeLeaf = this_.app.workspace.activeLeaf;
		// ** 注意,这个非常重要,这个if中必须打开新标签页才会执行,如果设置了打开文件,那么会执行两次,一次打开新标签页执行一次,一次打开文件改变布局执行一次,所以会执行两次
		// 所以如果加了锁,第二次就不会执行,就会不生效
		if (activeLeaf && activeLeaf.view.getViewType() === 'empty') {
			// 在当前页面打开文件(searchPageIndex,this_)
			添加最近文件和新建文件(this_)
		}else {
			// 获取当前活动的文件
			const currentFile = this.app.workspace.getActiveFile();
			if (currentFile) {
				console.log(99999999)
				添加最近文件和新建文件(this_)
				更改文档元数据标签到文件最下面(this_)
				根据文件名添加常用文件新便签页(currentFile.path,this_);
				根据元数据搜索文件(currentFile.path,this_);
			}
		}
	}));
	// // 在加载插件时添加一个监听器来监听文件的删除操作vv
	// this.registerEvent(this.app.vault.on('delete', (deleteFile:TFile) => {
	// 	// delete this_.fileOpenCounts[deleteFile.path];
	// 	// 这里可以执行你想要的操作，比如记录日志、触发通知等
	// }));
}

export async function 根据文件名添加常用文件新便签页(file:string,this_:MyPlugin) {
	const key = "根据文件名添加常用文件新便签页"
	const flag = redisLocak(key,this_)
	if (flag) {
		// 读取最近的文件11
		await removeFileList(this_, "file-list")
		console.log("判断是否是最近打开的文件,如果是则添加最近打开的文件"+recentOpenFileMdPath)
		if (file === recentOpenFileMdPath) {
			const emptyStateContainer = this_.app.workspace.containerEl.querySelector(".mod-vertical")
				?.querySelector(".mod-active")
				?.querySelector(".workspace-tab-container")
				?.querySelector(".mod-active")
				?.querySelector(".workspace-leaf-content")
				?.querySelector(".view-content")
			if (emptyStateContainer) {
				// 获取按打开次数排序的文件列表
				const sortedFiles = Object.entries(this_.fileOpenCounts)
					.sort((a, b) => b[1] - a[1]) // 按次数降序排序1
					.map(entry => entry[0]);
				// 添加样式
				emptyStateContainer.addClass('recent-files-container');
				this_.settings.listNode = document.body.createEl('div', {cls: 'file-list'});
				sortedFiles.forEach(filePath => {
					if (filePath != this_.settings.filePath1 && filePath != searchPageIndex) {
						const fileCard = this_.settings.listNode.createEl('div', {cls: 'file-card'});
						// // 添加图标
						// fileCard.createEl('img', {
						// 	attr: {
						// 		src: someVariable, // 替换为您的图标路径
						// 		alt: 'File Icon',
						// 		style: 'max-width: 25px;' // 设置图标样式
						// 	}
						// });
						// 添加文件名
						fileCard.createEl('div', {text: path.basename(filePath)});
						// 添加点击事件监听器
						fileCard.addEventListener('click', () => {
							在当前页面打开文件(filePath, this_);
						});
					}
				});
				emptyStateContainer.insertBefore(this_.settings.listNode, emptyStateContainer.firstChild);
			}
		}
		console.log(key+"执行了一次")
	}else{
		console.log(key+"加锁没执行")
	}
}


export async function 	根据元数据搜索文件(file:string, this_:MyPlugin) {
	const key = "根据元数据搜索文件"
	const flag = redisLocak(key, this_)
	if (flag) {
		// 读取最近的文件11
		removeFileList(this_, "sjz-yuanShuju-div")
		if (file === searchPageIndex) {
			const emptyStateContainer = this_.app.workspace.containerEl.querySelector(".mod-vertical")
				?.querySelector(".mod-active")
				?.querySelector(".workspace-tab-container")
				?.querySelector(".mod-active")
				?.querySelector(".workspace-leaf-content")
				?.querySelector(".view-content")
			if (emptyStateContainer) {
				const currentFile = this_.app.workspace.getActiveFile();
				// 添加样式
				const sjzDiv = document.body.createEl('div', {cls: 'sjz-yuanShuju-div'});
				const htmlInputElement = document.body.createEl('input', {cls: 'sjz-input'});
				sjzDiv.appendChild(htmlInputElement)
				htmlInputElement.value = "常用"
				htmlInputElement.addEventListener('keydown', function (event) {
					if (event.key === 'Enter') {
						保存临时数据到文件(this_, htmlInputElement.value, this_.recentTags, recentSearchTagPath)
						const value = htmlInputElement.value;
						if (currentFile) {
							更新元数据搜索历史记录(this_, htmlInputElement, currentFile)
							this_.app.vault.modify(currentFile, yml + "\n" + sql.replace(/常用/g, value))
						}
					}
				});
				emptyStateContainer.insertBefore(sjzDiv, emptyStateContainer.firstChild);
				if (currentFile) {
					更新元数据搜索历史记录(this_, htmlInputElement, currentFile)
				}
			}
		}
		console.log(key+"执行了一次")
	}else{
		console.log(key+"加锁没执行")
	}
}

export async function  这个是直接编辑新标签页(leaf : WorkspaceLeaf,this_:MyPlugin) {
	const emptyStateContainer = leaf.view.containerEl.children[1];
	emptyStateContainer.empty()
	// 获取按打开次数排序的文件列表
	const sortedFiles = Object.entries(this_.fileOpenCounts)
		.sort((a, b) => b[1] - a[1]) // 按次数降序排序1
		.map(entry => entry[0]);
	// 添加样式
	emptyStateContainer.addClass('recent-files-container');
	// 创建列表并添加文件项
	const list = emptyStateContainer.createEl('div', { cls: 'file-list' });
	sortedFiles.forEach(filePath => {
		const fileCard = list.createEl('div', { cls: 'file-card' });
		// 添加图标
		fileCard.createEl('img', {
			attr: {
				src: someVariable, // 替换为您的图标路径
				alt: 'File Icon',
				style: 'max-width: 25px;' // 设置图标样式
			}
		});
		// 添加文件名
		fileCard.createEl('div', { text:path.basename(filePath)});
		// 添加点击事件监听器
		fileCard.addEventListener('click', () => {
			// this_.openFile(filePath);
			// this_.openSpecificFile(filePath)
		});
	});
}

async function removeFileList(this_:MyPlugin,className:string) {

	const fileElements: HTMLCollectionOf<Element> = document.getElementsByClassName(className);
	// 遍历获取到的元素并删除
	for (let i = fileElements.length - 1; i >= 0; i--) {
		const fileElement = fileElements[i];
		fileElement.parentNode?.removeChild(fileElement);
	}
}

async function removeButton(this_:MyPlugin) {
	const fileElements: HTMLCollectionOf<Element> = document.getElementsByClassName("sjz-button-a");
	// 遍历获取到的元素并删除
	for (let i = fileElements.length - 1; i >= 0; i--) {
		const fileElement = fileElements[i];
		fileElement.parentNode?.removeChild(fileElement);
	}
	const fileElements1: HTMLCollectionOf<Element> = document.getElementsByClassName("sjz-button-b");
	// 遍历获取到的元素并删除
	for (let i = fileElements1.length - 1; i >= 0; i--) {
		const fileElement1 = fileElements1[i];
		fileElement1.parentNode?.removeChild(fileElement1);
	}
	const fileElements2: HTMLCollectionOf<Element> = document.getElementsByClassName("sjz-button-c");
	// 遍历获取到的元素并删除
	for (let i = fileElements2.length - 1; i >= 0; i--) {
		const fileElement2 = fileElements2[i];
		fileElement2.parentNode?.removeChild(fileElement2);
	}
}


async function 更新元数据搜索历史记录(this_:MyPlugin,element :HTMLInputElement,fileName :TFile) {
	const fileElements: HTMLCollectionOf<Element> = document.getElementsByClassName("sjz-yuanShuju-div");
	for (let i = fileElements.length - 1; i >= 0; i--) {
		const fileElement = fileElements[i];
		for (let i = fileElement.children.length - 1; i >= 0; i--){
			if (fileElement.children[i].className==="sjz-recent-tags-a"){
				fileElement.removeChild(fileElement.children[i])
			}
		}
		// 获取按打开次数排序的文件列表
		const sortedFiles = Object.entries(this_.recentTags)
			.sort((a, b) => b[1] - a[1]) // 按次数降序排序1
			.map(entry => entry[0]);
		sortedFiles.forEach(filePath => {
			if (filePath!=this_.settings.filePath1) {
				const aaa = document.body.createEl('a', {cls: 'sjz-recent-tags-a'});
				aaa.text = path.basename(filePath)
				// 添加点击事件监听器
				aaa.addEventListener('click', () => {
					element.value = aaa.text
					if (fileName){
						this_.app.vault.modify(fileName,yml+"\n"+sql.replace(/常用/g,aaa.text))
					}
				});
				fileElement.appendChild(aaa)
			}
		});
	}
}

async function 添加最近文件和新建文件(this_:MyPlugin) {
	const guanbiFlag =true
	if (guanbiFlag){
		return
	}
	const key = "添加最近文件和新建文件"
	const flag = redisLocak(key,this_)
	if (flag) {
		removeButton(this_)
		const fileElements: HTMLCollectionOf<Element> = document.getElementsByClassName("view-header-nav-buttons");
		for (let i = fileElements.length - 1; i >= 0; i--) {
			const fileElement = fileElements[i];
			const sjzButton = fileElement.createEl('a', { cls: 'sjz-button-a' });
			sjzButton.text = '最近文件'
			sjzButton.addEventListener('click', () => {
				判断文件是否激活并打开(this_.settings.filePath1, this_);
			});
			const sjzButton1 = fileElement.createEl('a', { cls: 'sjz-button-b' });
			sjzButton1.text = '定位文件'
			sjzButton1.addEventListener('click', (this_) => {
				// createNewFileByData(this_,"新建文件")
				// const listCommands = this_.app;
				console.log(app)
				// @ts-ignore
				app.commands.executeCommandById("file-explorer:reveal-active-file")
				console.log("执行命令定位文件")
			});

			const sjzButton2 = fileElement.createEl('a', { cls: 'sjz-button-c' });
			sjzButton2.text = '搜索文件'
			sjzButton2.addEventListener('click', () => {
				在当前页面打开文件(searchPageIndex,this_)
			});
			fileElement.appendChild(sjzButton)
			fileElement.appendChild(sjzButton2)
			// todo shijizne我修改的  按钮
			fileElement.appendChild(sjzButton1)
		}
		console.log(key+"执行了一次")
	}else {
		console.log(key+"加锁没执行")
	}
}

async function 更改文档元数据标签到文件最下面(this_:MyPlugin) {
	const key = "更改文档元数据标签到文件最下面"
	const flag = redisLocak(key,this_)
	if (flag) {
		// 获取当前活动的叶子节点，即当前编辑或预览的文档
		const activeLeaf = this.app.workspace.activeLeaf;
		// 确保获取到了活动的叶子节点
		if (activeLeaf) {
			// 获取当前活动视图的内容容器元素
			const container = activeLeaf.view.containerEl;
			// 使用querySelectorAll在容器中查找所有类名为'aaa'的元素
			const fileElements = container.querySelectorAll('.metadata-container');
			for (let i = fileElements.length - 1; i >= 0; i--) {
				const fileElement = fileElements[i];
				bianliang.parentYuanShuju = fileElement
				const parentNode = fileElement.parentNode;
				parentNode?.removeChild(fileElement);
				if (parentNode) {
					for (let i = parentNode.children.length - 1; i >= 0; i--) {
						if (parentNode.children[i].className === "cm-contentContainer") {
							parentNode.insertAfter(bianliang.parentYuanShuju, parentNode.children[i])
						}
					}
				}
			}
		}
		console.log(key+"执行了一次")
	}else {
		console.log(key+"加锁没执行")
	}
}

export async function 定时更新(this_:MyPlugin){
	// 删除最近的文件不存在文件
	for (const fileOpenCountsKey in this_.fileOpenCounts) {
		const abstractFileByPath = this_.app.vault.getAbstractFileByPath(fileOpenCountsKey);
		if (abstractFileByPath==null){
			delete this_.fileOpenCounts[fileOpenCountsKey];
		}
	}
}

